
import numpy as np
from scipy import stats

# 场景：某工厂有两条生产线（A线和B线）生产同种产品
# 质量部门需要检测：
# 1. 两条线的平均重量是否有差异（均值检验）
# 2. 两条线的重量波动是否不同（方差检验）

# 设置随机种子保证结果可复现
np.random.seed(42)

# 模拟生产数据（单位：克）
# A线：平均重量=500g，标准差=10g，样本量=30
line_a = np.random.normal(loc=500, scale=10, size=30)

# B线：平均重量=503g，标准差=15g，样本量=30
line_b = np.random.normal(loc=503, scale=15, size=30)

print("A线样本均值:", round(line_a.mean(), 2), "标准差:", round(line_a.std(), 2))
print("B线样本均值:", round(line_b.mean(), 2), "标准差:", round(line_b.std(), 2))

# ----------------------------
# 第一步：方差齐性检验 (F检验)
# ----------------------------
# 目的：检查两条生产线重量的波动程度（方差）是否相同
# 假设：
#   H0: σ²_A = σ²_B (方差相等)
#   H1: σ²_A ≠ σ²_B (方差不相等)
print("\n===== 方差齐性检验 (F检验) =====")

# 计算F统计量：取较大方差除以较小方差
var_a = line_a.var(ddof=1)  # ddof=1 计算样本方差（无偏估计）
var_b = line_b.var(ddof=1)
f_value = max(var_a, var_b) / min(var_a, var_b)

# 计算自由度
df1 = len(line_a) - 1
df2 = len(line_b) - 1

# 计算双尾p值
p_value = 2 * min(stats.f.cdf(f_value, df1, df2), 1 - stats.f.cdf(f_value, df1, df2))

print(f"F统计量: {f_value:.4f}, p值: {p_value:.4f}")

# 结果解读
alpha = 0.05  # 显著性水平
if p_value > alpha:
    print(f"结论(p={p_value:.4f} > {alpha}): 接受原假设，两条线方差无显著差异")
    equal_var = True  # 标记方差相等
else:
    print(f"结论(p={p_value:.4f} <= {alpha}): 拒绝原假设，两条线方差显著不同")
    equal_var = False  # 标记方差不相等

# ----------------------------
# 第二步：均值差异检验 (t检验)
# ----------------------------
# 目的：检查两条生产线平均重量是否相同
# 假设：
#   H0: μ_A = μ_B (均值相等)
#   H1: μ_A ≠ μ_B (均值不等)
print("\n===== 均值差异检验 (t检验) =====")

# 使用scipy的ttest_ind，根据方差检验结果设置equal_var参数
t_stat, p_val = stats.ttest_ind(line_a, line_b, equal_var=equal_var)

print(f"t统计量: {t_stat:.4f}, p值: {p_val:.4f}")

# 结果解读
if p_val > alpha:
    print(f"结论(p={p_val:.4f} > {alpha}): 接受原假设，两条线平均重量无显著差异")
else:
    print(f"结论(p={p_val:.4f} <= {alpha}): 拒绝原假设，两条线平均重量显著不同")

# ----------------------------
# 第三步：综合生产决策
# ----------------------------
print("\n===== 生产质量分析报告 =====")
print(f"A线: 平均重量={line_a.mean():.2f}g, 标准差={line_a.std():.2f}g")
print(f"B线: 平均重量={line_b.mean():.2f}g, 标准差={line_b.std():.2f}g")

if equal_var:
    print("→ 两条生产线重量稳定性相同(方差齐性)")
else:
    print("→ B线重量波动显著大于A线(方差异质性)")

if p_val > alpha:
    print("→ 两条生产线平均重量符合标准要求")
else:
    diff = line_b.mean() - line_a.mean()
    print(f"→ 检测到显著重量差异: B线比A线平均重{diff:.2f}g")

# 补充：方差检验的Levene法（更稳健的替代方案）
# 当数据不严格服从正态分布时，推荐使用
print("\n[补充] Levene方差检验(更稳健):")
levene_stat, levene_p = stats.levene(line_a, line_b)
print(f"Levene统计量: {levene_stat:.4f}, p值: {levene_p:.4f}")